package main

import (
	"github.com/astaxie/beego/logs"
	"reflect"
)

var (
	Log *logs.BeeLogger
)

func initLog() {

	//创建log实例
	Log = logs.NewLogger()
	//设置控制台输出
	_ := Log.SetLogger(logs.AdapterConsole)
	//打印行号
	Log.EnableFuncCallDepth(true)
	//日志 参数配置
	_ := Log.SetLogger(logs.AdapterFile, `{"filename":"test.log"}`)

	//logs.SetLogger(logs.AdapterFile,
	// `{"filename":"project.log","level":7,"maxlines":0,"maxsize":0,"daily":true,"maxdays":10}`)
	/**
	filename 保存的文件名
	maxlines 每个文件保存的最大行数，默认值 1000000
	maxsize 每个文件保存的最大尺寸，默认值是 1 << 28, //256 MB
	daily 是否按照每天 logrotate，默认是 true
	maxdays 文件最多保存多少天，默认保存 7 天
	rotate 是否开启 logrotate，默认是 true
	level 日志保存的时候的级别，默认是 Trace 级别
	perm 日志文件权限
	*/
}
func init() {
	initLog()
}

type Student struct {
	StuName string `json:"stuName" orm:"stu_name"`
	StuAge  int    `json:"stuAge" orm:"stu_age"`
	StuSex  int    `json:"stuSex" orm:"stu_sex"`
}

func main() {
	//通过字段名称获取 对应的tag 信息
	fieldTagByFieldName()

	fieldValueTest()

	Log.Info(reflect.TypeOf(doType("ruis")).Kind().String())
	Log.Info(reflect.TypeOf(doType(34)).Kind().String())
	Log.Info(reflect.TypeOf(doType(make(map[string]interface{}, 2))).Kind().String())

	Log.Info("%f", 1e4)
}

func fieldValueTest() {
	stu := Student{
		StuName: "ruixule",
		StuSex:  1,
		StuAge:  24,
	}
	//获取value 信息
	of := reflect.ValueOf(stu)
	//通过value 获取type 信息
	t := of.Type()
	Log.Info("type 信息=", t.Name())

	//循环字段名称和值
	for i := 0; i < t.NumField(); i++ {
		Log.Info("%8s字段 = 值：%v ", t.Field(i).Name, of.Field(i))
	}

}

func doType(i interface{}) interface{} {
	switch v := i.(type) {
	case int:
		Log.Info("int =%v", i)
		return v
	case string:
		Log.Info("string =%v", i)
		//return string(v)
		return v
	case map[string]interface{}:
		Log.Info("map =%v", i)
		return v
	}
	return nil
}

//通过字段名称获取 对应的tag 信息
func fieldTagByFieldName() {
	//实例化一个student对象
	s := Student{}
	//通过type的变量
	ty := reflect.TypeOf(s)
	//获取属性名成对应的tag 信息
	field, ok := ty.FieldByName("StuName")
	if ok {
		//获取对应字段的tag 信息
		// json:"stuName" orm:"stu_name"
		Log.Info("StuName 的tag 信息= %v ", field.Tag)
		Log.Info("StuName json的tag信息= %v ", field.Tag.Get("json"))
		Log.Info("StuName 字段的类型= %v ", field.Type.String())
	}

	Log.Info("s 对应反射结构体的名称= %v", ty.Name())
	Log.Info("s 对应反射结构体的属性个数= %v", ty.NumField())
	Log.Info("s 对应反射结构体所在的包= %v", ty.PkgPath())
	Log.Info("s 对应反射结构体所在的包全路径= %v", ty.String())
	Log.Info("s 反射对应的类型= %v", ty.Kind().String())

	for i := 0; i < ty.NumField(); i++ {
		Log.Info("第%d字段 = 名称：%v", i, ty.Field(i).Name)
	}

}
